{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# `noexcept` 的作用与对重载决议的影响\n",
    "\n",
    "- `noexcept` 指定函数是否承诺不抛异常。编译器可据此优化（省略 unwind 信息、启用更激进内联等）。\n",
    "- 对重载决议：当存在两个可行函数且匹配度相同时，`noexcept` 版本优先（C++17 规则）。例如 `std::vector` 选择移动构造时，会优先使用 `noexcept` 移动版本，以确保异常安全。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 在前面讨论 noexcept 时提到“省略 unwind 信息”，指的是编译器在确信某段代码不会抛出异常时，可以不生成用于异常展开（stack unwinding）的元数据与辅助指令。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 异常安全三个级别\n",
    "\n",
    "1. **Basic Guarantee**：即使抛异常，不会泄漏资源，对象保持有效但状态可能改变。\n",
    "2. **Strong Guarantee**：要么成功，要么无副作用（操作回滚）。\n",
    "3. **No-throw Guarantee**：承诺不抛异常（`noexcept`）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 构造函数抛异常时的清理\n",
    "\n",
    "- 一旦构造函数抛出，已经构造完成的子对象（成员、基类）自动逆序销毁，未构造的不会销毁。\n",
    "- 使用 RAII 成员可确保资源在部分构造时也能自动释放。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# `std::exception_ptr` 与跨线程异常\n",
    "\n",
    "- `std::exception_ptr` 捕获当前异常 `std::current_exception()`，可在任意线程存储。\n",
    "- 另一线程调用 `std::rethrow_exception(ptr)` 重新抛出原异常，实现跨线程传递（用于任务、线程池、`std::async` 等）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 何时用错误码而非异常\n",
    "\n",
    "- 性能/异常成本敏感（硬实时、嵌入式）。\n",
    "- API 边界或语言交互层（C 接口不支持异常）。\n",
    "- 频繁可预期的分支（如终止条件）。\n",
    "   统一策略：定义错误类型（`std::error_code`/`expected<T,E>`），在业务层决定是否用异常包装或直接处理。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 解释栈溢出 vs 堆溢出，常见触发场景？\n",
    "\n",
    "- 栈溢出：局部数组/递归过深超出栈空间；典型如 `char buf[1024]; gets(buf);` 或无限递归。\n",
    "- 堆溢出：动态分配区越界写入，如 `new char[16]; strcpy(dst,\"long...\")`。栈溢出多触发栈保护（canary），堆溢出会破坏元数据导致 UAF 或任意写。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **防止格式化字符串漏洞（无 `std::format` 时）？**\n",
    "\n",
    "- 禁用 `printf(buf);` 这类直接使用外部输入做格式串；使用 `printf(\"%s\", buf)`。\n",
    "- 采用安全库：`fmt`（libfmt）、`boost::format`；或 C11 `snprintf`。\n",
    "- 静态分析/编译器警告（`-Wformat -Wformat-security`）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **解析第三方输入的健壮性：防整数溢出、缓冲区越界**\n",
    "\n",
    "- 所有长度/偏移使用宽类型检查（`size_t`, `uint64_t`）。\n",
    "- 读前校验剩余字节，使用 `if (remaining < needed) throw`.\n",
    "- 使用 `std::vector::at`, `span`；整形运算前先范围检查（`if (a > max - b) ...`）"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
